ユーザーアカウント認証(OAuth 2.0)でAPI v4を使いGoogle Analyticsのデータを取得する
はじめに
データアナリティクス事業本部のkobayashiです。
以前Google AnalyticsのデータをPythonで扱う必要があったためGoogle Analytics APIのV4でデータを取得してみました。
この記事ではAPIを使う際のGoogle認証方法としてサービスアカウント認証を使っています。今回はサービスアカウントではなくユーザーアカウント認証(OAuth 2.0)を使ってみたいと思います。
環境
- macOS Mojave
- Python 3.7.4
Google Analytics APIでデータを取得する手順
Analytics APIを使ってGoogle Analyticsのデータを取得するには、
- Analytics APIの設定を行う
- クライアントライブラリをインストールする
- Pythonでコードを記述し実行する
という手順になります。
Analytics API を使う準備
Analytics API V4を使うにはサービスアカウント認証の場合はまず以下の設定が必要でした。
- GCP上に新規プロジェクト作成(または既存のプロジェクトがあればそれでもOK)
- GCPプロジェクトに対してAPIを有効にする
- GCP上でAPI用のサービスアカウントを作り鍵をJSON形式で作成する
- サービスアカウントを作成した際にサービスアカウントIDをGoogleAnalitycsへユーザー登録する。
今回はユーザーアカウント認証で同じことを行いたいので手順としては以下になります。
- GCP上に新規プロジェクト作成(または既存のプロジェクトがあればそれでもOK)
- GCPプロジェクトに対してAPIを有効にする
- GCP上でOAuth同意画面を設定する
- GCP上でOAuth 2.0 クライアント IDを発行する
- GoogleAnalyticsで認証を行うユーザーに権限を付与する。
前回の設定でAPIを有効にする
までは共通になるので、GCP上でOAuth同意画面を設定する
から設定を行いたいと思います。
GCP上でOAuth同意画面を設定する
手順1)GCPにログインしAPIとサービス
へ進み、OAuth 同意画面
を押下する。
手順2)User Type
の選択画面で内部
を選択して作成
を押下する。
手順3)アプリ情報画面で必要情報を入力し保存して次へ
を押下して設定する。
- アプリ名 :適当なアプリ名を入力
- ユーザーサポートメール : 連絡の取れるメールアドレスを入力
- ディベロッパーの連絡先情報 > メールアドレス : 連絡の取れるメールアドレスを入力
次の画面に進むとスコープの設定を行えますが、今回は対象外のため設定を行いません。
GCP上でOAuth 2.0 クライアント IDを作成後、認証情報をダウンロードする
手順1)APIとサービス
へ進み、認証情報
を押下し、認証情報画面に進み認証情報を作成 > OAuthクライアントID
を押下する。
手順2)OAuth クライアント ID の作成で必要情報を入力し作成
を押下してOauthクライアントIDを作成する。
- アプリケーションの種類 :
デスクトップアプリ
を選択(ローカルマシーンで実行するため) - 名前 : 適当な名前を入力
OAuth クライアント ID が作成されるとクライアント
とクライアントシークレット
が表示されるので控えておく。
Google Analyticsでユーザーに権限を与える
手順1)ユーザー管理の権限を持ったアカウントでGoogle Analyticsにログインし、メニューから管理
を押下する。
手順4)ユーザー認証を行いたいユーザーのメールアドレスを入力し、権限はデータを取得するだけなので表示と分析
にする。
これでユーザーアカウント認証でGoogle Analyticsでデータを取得できるようになりましたので設定は終わりです。
pydata-google-authのインストール
ユーザーアカウント認証(OAuth 2.0)を行う際にユーザー認証情報をキャッシュしてくれるモジュールをインストールします。このモジュールを使うことでスクリプトの実行時に初回のみOAuth同意画面で認証を行いその情報をキャッシュし、二回目以降はそのキャッシュを使ってスクリプトを実行することができます。
Welcome to pypdata-google-auth’s documentation! — pydata-google-auth 0.1.0 documentation
pipを使ってインストールできますので下記のコマンドを実行します。
pip install --upgrade pydata-google-auth
以上で準備が整ったので実際にデータを取得するコードを記述します。
Analytics APIを使ってデータを取得する
元となるコードは以前で使用したコードをベースにしています。
from googleapiclient.discovery import build from pprint import pprint import json import pydata_google_auth VIEW_ID = '<REPLACE_WITH_VIEW_ID>' # ユーザーアカウントを使用した認証 def initialize_analytics_reporting(): scoped_credentials = pydata_google_auth.get_user_credentials( [ 'https://www.googleapis.com/auth/cloud-platform', 'https://www.googleapis.com/auth/analytics.readonly' ], client_id='{クライアントID}', client_secret='{クライアントシークレット}' ) return build("analyticsreporting", "v4", credentials=scoped_credentials) def get_report(analytics, next_page_token="0"): request_body = { "reportRequests": [{ "viewId": VIEW_ID, "pageToken": next_page_token, "pageSize": 100, # "samplingLevel": "LARGE", "dateRanges": [{"startDate": "2021-02-01", "endDate": "2021-02-20"}], "metrics": [{"expression": "ga:pageviews"}], "dimensions": [{"name": "ga:pagePath"}, {"name": "ga:pageTitle"}], "orderBys": [{"fieldName": "ga:pageviews", "sortOrder": "DESCENDING"}] }] } return analytics.reports().batchGet(body=request_body).execute() def print_response(response): rows = [] for report in response.get("reports", []): column_header = report.get("columnHeader", {}) dimension_headers = column_header.get("dimensions", []) metric_headers = column_header.get("metricHeader", {}).get("metricHeaderEntries", []) next_page_token = report.get('nextPageToken') for row in report.get("data", {}).get("rows", []): row_data = {} dimensions = row.get("dimensions", []) date_range_values = row.get("metrics", []) for header, dimension in zip(dimension_headers, dimensions): row_data[header] = dimension for i, values in enumerate(date_range_values): for metricHeader, value in zip(metric_headers, values.get("values")): row_data[metricHeader.get("name")] = value rows.append(row_data) return rows, next_page_token def print_all_response(analytics): next_page_token = "0" rows = [] while next_page_token is not None: response = get_report(analytics, next_page_token) r, next_page_token = print_response(response) rows.extend(r) pprint(rows) def main(): analytics = initialize_analytics_reporting() print_all_response(analytics) if __name__ == "__main__": main()
サービスアカウントで使用したコードからの主な変更ポイントとしては以下になります。
- pydata_google_authのget_user_credentialsメソッドを使いユーザーアカウント認証を行う。
client_id
パラメータにOAuth クライアント ID を作成した際に控えたクライアント
を指定するclient_secret
パラメータにOAuth クライアント ID を作成した際に控えたクライアントシークレット
を指定する
このスクリプトを実行してみます。
ユーザーアカウント認証でスクリプトを実行する
手順1)スクリプトを実行するとOAuth同意画面用のアドレスが表示されるのでリンク先へ遷移する。
Please visit this URL to authorize this application: https://accounts.google.com/o/oauth2/auth?response_type=code&client_id=xxxxxxxxxx-xxxxxxxxx.apps.googleusercontent.com&redirect_uri=urn%3Aietf%3Awg%3Aoauth%3A2.0%3Aoob&scope=https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fcloud-platform+https%3A%2F%2Fwww.googleapis.com%2Fauth%2Fanalytics.readonly&state=xxxxx&prompt=consent&access_type=offline Enter the authorization code:
手順2)OAuth同意画面が表示されるので問題なければ許可
を押下する。
手順4)Authコードをスクリプト実行しているウィンドに貼り付け実行する。
Enter the authorization code: 4/1AY0e-g5fwhWxxxxxxxxxxxxxxxxxxxxxxxx
以上でGoogle Analyticsのデータが取得できます。
まとめ
Google AnalyticsのデータをAnalytics API V4を使い、ユーザーアカウント認証で取得してみました。特に難しい設定もなくデータが取得できました。実際に使う際にはOAuth同意画面のスコープを適切に設定して使いましょう。
最後まで読んで頂いてありがとうございました。